package com.sequenceiq.samples.core.service.simple; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.services.autoscaling.AmazonAutoScalingClient; import com.amazonaws.services.autoscaling.model.*; import com.amazonaws.services.ec2.AmazonEC2Client; import com.amazonaws.services.ec2.model.*; import com.amazonaws.services.ec2.model.Instance; import com.amazonaws.services.elasticloadbalancing.AmazonElasticLoadBalancingClient; import com.amazonaws.services.elasticloadbalancing.model.*; import com.sequenceiq.samples.core.service.AutoScalingService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; @Component public class SimpleAutoScalingService implements AutoScalingService { @Autowired private AmazonAutoScalingClientFactory amazonAutoScalingClientFactory; @Autowired private AmazonElasticLoadBalancingClientFactory amazonElasticLoadBalancingClientFactory; @Autowired private AmazonEC2ClientFactory amazonEC2ClientFactory; private CreateLoadBalancerResult createLoadBalancer(AmazonElasticLoadBalancingClient client, String name, String... zones) { CreateLoadBalancerRequest lbRequest = new CreateLoadBalancerRequest(); lbRequest.setLoadBalancerName(name); lbRequest.withAvailabilityZones(zones); lbRequest.setListeners(Arrays.asList(new Listener("HTTP", 80, 80))); return client.createLoadBalancer(lbRequest); } @Override public CreateLoadBalancerResult createLoadBalancer(AWSCredentials credentials, String name, String... zones) { return createLoadBalancer(amazonElasticLoadBalancingClientFactory.createAmazonElasticLoadBalancingClient(credentials), name, zones); } private RegisterInstancesWithLoadBalancerResult registerInstancesToLoadBalancer(AmazonElasticLoadBalancingClient client, AmazonEC2Client simpleClient, String lbName) { List<Instance> instances = new ArrayList<>(); for (Reservation reservation : simpleClient.describeInstances().getReservations()) { instances.addAll(reservation.getInstances()); } List<com.amazonaws.services.elasticloadbalancing.model.Instance> instanceId = new ArrayList<>(); List<String> instanceIdString = new ArrayList<>(); for (Instance instance : instances) { instanceId.add(new com.amazonaws.services.elasticloadbalancing.model.Instance(instance.getInstanceId())); instanceIdString.add(instance.getInstanceId()); } RegisterInstancesWithLoadBalancerRequest register = new RegisterInstancesWithLoadBalancerRequest(); register.setLoadBalancerName(lbName); register.setInstances(instanceId); return client.registerInstancesWithLoadBalancer(register); } @Override public RegisterInstancesWithLoadBalancerResult registerInstancesToLoadBalancer(AWSCredentials credentials, String lbName) { return registerInstancesToLoadBalancer(amazonElasticLoadBalancingClientFactory.createAmazonElasticLoadBalancingClient(credentials), amazonEC2ClientFactory.createAmazonEC2Client(credentials), lbName); } public CreateKeyPairResult createKeyPair(AmazonEC2Client client, String keyName) { CreateKeyPairRequest createKeyPairRequest = new CreateKeyPairRequest().withKeyName(keyName); CreateKeyPairResult createKeyPairResult = client.createKeyPair(createKeyPairRequest); return createKeyPairResult; } @Override public List<LaunchConfiguration> describeAmazonLaunchConfigurations(AWSCredentials credentials) { AmazonAutoScalingClient amazonAutoScalingClient = amazonAutoScalingClientFactory.createAmazonAutoScalingClient(credentials); DescribeLaunchConfigurationsResult describeLaunchConfigurationsResult = amazonAutoScalingClient.describeLaunchConfigurations(); return describeLaunchConfigurationsResult.getLaunchConfigurations(); } @Override public List<AutoScalingGroup> describeAmazonAutoScalingGroups(AWSCredentials credentials) { AmazonAutoScalingClient amazonAutoScalingClient = amazonAutoScalingClientFactory.createAmazonAutoScalingClient(credentials); DescribeAutoScalingGroupsResult describeAutoScalingGroupsResult = amazonAutoScalingClient.describeAutoScalingGroups(); return describeAutoScalingGroupsResult.getAutoScalingGroups(); } @Override public List<AutoScalingInstanceDetails> describeAmazonAutoScalingInstances(AWSCredentials credentials) { AmazonAutoScalingClient amazonAutoScalingClient = amazonAutoScalingClientFactory.createAmazonAutoScalingClient(credentials); DescribeAutoScalingInstancesResult describeAutoScalingInstancesResult = amazonAutoScalingClient.describeAutoScalingInstances(); return describeAutoScalingInstancesResult.getAutoScalingInstances(); } @Override public List<SpotPrice> describeSpotPriceHistory(AWSCredentials credentials) { AmazonEC2Client amazonEC2Client = amazonEC2ClientFactory.createAmazonEC2Client(credentials); return amazonEC2Client.describeSpotPriceHistory().getSpotPriceHistory(); } @Override public void createAmazonAutoScalingGroup(AWSCredentials credentials, String name, int maxsize, int minsize, int coolDown, String configName, Collection<String> loadBalancerNames, Collection<com.amazonaws.services.autoscaling.model.Tag> tags) { AmazonAutoScalingClient amazonAutoScalingClient = amazonAutoScalingClientFactory.createAmazonAutoScalingClient(credentials); CreateAutoScalingGroupRequest createAutoScalingGroupRequest = new CreateAutoScalingGroupRequest().withAutoScalingGroupName(name) .withDefaultCooldown(coolDown).withLaunchConfigurationName(configName).withMaxSize(maxsize).withMinSize(minsize).withTags(tags) .withLoadBalancerNames(loadBalancerNames).withAvailabilityZones(Arrays.asList("us-west-2b")); amazonAutoScalingClient.createAutoScalingGroup(createAutoScalingGroupRequest); } @Override public void updateAmazonAutoScalingGroupCoolDown(AWSCredentials credentials, String name, int coolDown) { AmazonAutoScalingClient amazonAutoScalingClient = amazonAutoScalingClientFactory.createAmazonAutoScalingClient(credentials); UpdateAutoScalingGroupRequest updateAutoScalingGroupRequest = new UpdateAutoScalingGroupRequest() .withAutoScalingGroupName(name) .withDefaultCooldown(coolDown); amazonAutoScalingClient.updateAutoScalingGroup(updateAutoScalingGroupRequest); } @Override public void updateAmazonAutoScalingGroupMaxSize(AWSCredentials credentials, String name, int maxSize) { AmazonAutoScalingClient amazonAutoScalingClient = amazonAutoScalingClientFactory.createAmazonAutoScalingClient(credentials); UpdateAutoScalingGroupRequest updateAutoScalingGroupRequest = new UpdateAutoScalingGroupRequest() .withAutoScalingGroupName(name) .withMaxSize(maxSize); amazonAutoScalingClient.updateAutoScalingGroup(updateAutoScalingGroupRequest); } @Override public void updateAmazonAutoScalingGroupMinSize(AWSCredentials credentials, String name, int minSize) { AmazonAutoScalingClient amazonAutoScalingClient = amazonAutoScalingClientFactory.createAmazonAutoScalingClient(credentials); UpdateAutoScalingGroupRequest updateAutoScalingGroupRequest = new UpdateAutoScalingGroupRequest() .withAutoScalingGroupName(name) .withMinSize(minSize); amazonAutoScalingClient.updateAutoScalingGroup(updateAutoScalingGroupRequest); } }